<?php

global $strGEstilo;

/**
 * Arreglo con los scripts y los CSS que se deben de poner en el template principal
**/
$__arrGExtraTemplateFiles = array();

/**
 * Clase que maneja los templates
 */
class Template {
  var $strTemplateDir   ;
  var $strEstiloOverride;

  /**
   * Función que obtiene un archivo de template y lo parsea para poder ser
   * utilizado en un "eval" y que las variables que se definen dentro de el
   * puedan ser substituidas.
   *
   * @param String $strTemplate nombre del archivo del template (con respecto al path $this->strTemplateDir)
   *
   * @return String Template convertido para ser manejado por un "eval"
   */
  function Get($strTemplate) {
    $strArchivoLeer = BaseConfig::LoadTemplate($strTemplate);
    
    if(file_exists($strArchivoLeer)) {
      $fd = fopen ($strArchivoLeer, "r");
      $strTemplateLeido = Template::AgregarSlashes(fread($fd, filesize ($strArchivoLeer)));
      fclose ($fd);
    } else {
      $strTemplateLeido = "No se encuentra $strTemplate<br />";
    }
    return $strTemplateLeido;
  }
  
  static function AgregarSlashes($strTexto) {
    return str_replace("\"", "\\\"", $strTexto);
  }
  
  /**
   * Funcion que agrega un archivo para ser incluido (de tipo JS o CSS) en
   * los templates generales.
   * 
   * @param string $strArchivo Nombre del archivo o URL del recurso
   * @param string $strTipo    Tipo de archivo (js o css)
   */
  function AgregarArchivoExtra($strArchivo, $strTipo = "js") {
    Template::AgregarArchivoExtra_S($strArchivo, $strTipo);
  }

  /**
   * Funcion que agrega un archivo para ser incluido (de tipo JS o CSS) en
   * los templates generales. (Llamada estatica)
   * 
   * @param string $strArchivo Nombre del archivo o URL del recurso
   * @param string $strTipo    Tipo de archivo (js o css)
   */
  static function AgregarArchivoExtra_S($strArchivo, $strTipo = "js") {
    global $__arrGExtraTemplateFiles;
    $__arrGExtraTemplateFiles[$strTipo][$strArchivo] = $strArchivo;
  }
  
  /**
   *   Funcion que obtiene el codigo HTML de los archivos JS y CSS que se deben
   * incluir en un template
   * 
   * @global array $__arrGExtraTemplateFiles
   */
  function GetExtraFiles() {
    global $__arrGExtraTemplateFiles;
    
    $strExtraFiles = "";
    
    foreach($__arrGExtraTemplateFiles["css"] as $strArchivo) {
      $strURLArchivo = BaseConfig::URLExternalRes($strArchivo, "css");
      if($strURLArchivo) {
        $strExtraFiles .= "    <link rel='stylesheet' type='text/css' href='$strURLArchivo' />\n";
      } else {
        echo "No se encuentra el CSS $strArchivo<br />";
      }
    }
    
    if($strExtraFiles) {
      $strExtraFiles .= "\n";
    }
    
    foreach($__arrGExtraTemplateFiles["js"] as $strArchivo) {
      $strURLArchivo = BaseConfig::URLExternalRes($strArchivo, "js");
      if($strURLArchivo) {
        $strExtraFiles .= "    <script type='text/javascript' src='$strURLArchivo'></script>\n";
      } else {
        echo "No se encuentra el JS $strArchivo<br />";
      }
    }
    
    return $strExtraFiles;
  }
  
  /**
   * Funcion que llena un template con el contenido de un arreglo.
   * 
   * @param string $strTemplate
   * @param array  $arrValores
   */
  function FillWithArray($strTemplate, $arrValores = "") {
    if(is_array($arrValores)) {
      foreach($arrValores as $k => $v) {
        $$k = $v;
      }
    }
    
    eval('$strPagina = "' . $this->Get($strTemplate) . '";');
    return $strPagina;
  }

  /**
   * Función que obtiene la información contenida en un objeto basado en
   * ObjetoBase e imprime sus variables en el template $strTemplate
   *
   * @param ObjetoBase $oObject            Objeto que contiene la información a ser procesada.
   * @param String     $strTemplate        Nombre del archivo que contiene el template (con respecto al path $this->strTemplateDir)
   * @param array      $arrExtraParametros Parametros extra que se pasarán al template (en formato $arr["NombreVariable"] = "ValorVariable";)
   * @param boolean    $bolColumnaAlterna  Si es verdadero, se incluirá una variable $intColumnaAlterna para ser usada en el template, la cual valdrá 1 o 0. Util para hacer separación de rows por color (Cambiando la clase)
   *
   * @return String Template con los valores ya procesados.
   */
  function FillWithObject($oObject, $strTemplate, $arrExtraParametros = "", $bolColumnaAlterna = false) {
    $intColumnaAlterna = 1;
    if(is_array($arrExtraParametros)) {
      foreach($arrExtraParametros as $strNombreVar => $strValor) {
        $$strNombreVar = $strValor;
      }
    }

    foreach($oObject->__arrMapaDatos as $strNombreIndice => $strNombreVar) {
      $$strNombreVar    = $oObject->$strNombreVar;
      $$strNombreIndice = $oObject->$strNombreVar;
      if(isset($oObject->__arrMapaTipos[$strNombreIndice]) && ($oObject->__arrMapaTipos[$strNombreIndice] == 'D')) {
        $$strNombreVar    = Variables::FechaParaImprimir($oObject->$strNombreVar);
        $$strNombreIndice = Variables::FechaParaImprimir($oObject->$strNombreVar);
      }
    }

    if($bolColumnaAlterna) {
      $intColumnaAlterna = Variables::Alternar();
    }

    eval('$strRes = "' . $this->Get($strTemplate) . '";');
    return $strRes;
  }
  
  /**
   * Función que itera un arreglo y va poniendo cada una de las partes en un template
   * Tambien se llenan algunas columnas especiales, como:
   * 
   * $intColumnaAlterna, que indica la columna alterna
   * $intNRow, que indica el numero de columna
   * $strIndice, que indica el indice en el arreglo
   * 
   * @param array   $arrPiezas       Arreglo con las piezas a poner
   * @param string  $strTemplateHead Template contenedor del todo (Se pondrá el contenido de los rows en $strRows
   * @param string  $strTemplateRow  Template contenedor de cada row
   * @param array   $arrExtraParams  Arreglo con parametros extra
   * 
   * @return string Template ya imprimido
   */
  function DoIterate($arrPiezas, $strTemplateHead, $strTemplateRow, $arrExtraParams = "") {
    $strRows = "";
    $intNRow = 1;
    
    if(is_array($arrExtraParams)) {
      foreach($arrExtraParams as $k => $v) {
        $$k = $v;
      }
    }
    
    foreach($arrPiezas as $strIndice => $arrDesc) {
      $intColumnaAlterna = Variables::Alternar();
      
      foreach($arrDesc as $k => $v) {
        $$k = $v;
      }
      
      eval('$strRows .= "' . $this->Get($strTemplateRow) . '";');
      
      foreach($arrDesc as $k => $v) {
        $$k = "";
      }
      $intNRow++;
    }
    
    eval('$strPagina .= "' . $this->Get($strTemplateHead) . '";');
    
    return $strPagina;
  }
  
  /**
   * Función que itera un arreglo de objetos y va poniendo cada una de las 
   * partes en un template.
   * 
   * Tambien se llenan algunas columnas especiales, como:
   * 
   * $intColumnaAlterna, que indica la columna alterna
   * $intNRow, que indica el numero de columna
   * $strIndice, que indica el indice en el arreglo
   * 
   * @param ObjetoBase $arrPiezas    Arreglo con las piezas a poner
   * @param string  $strTemplateHead Template contenedor del todo (Se pondrá el contenido de los rows en $strRows
   * @param string  $strTemplateRow  Template contenedor de cada row
   * @param array   $arrExtraParams  Arreglo con parametros extra
   * 
   * @return string Template ya imprimido
   */
  function DoIterateObjects($arrObject, $strTemplateHead, $strTemplateRow, $arrExtraParams = "") {
    $strRows = "";
    $intNRow = 1;
    
    if($arrExtraParams == "") {
      $arrExtraParams = array();
    }
    
    foreach($arrObject as $strIndice => $oObject) {
      $arrExtraParams["intNRow"  ] = $intNRow  ;
      $arrExtraParams["strIndice"] = $strIndice;
      
      $strRows .= $this->FillWithObject($oObject, $strTemplateRow, $arrExtraParams, true);
      
      $intNRow++;
    }
    
    if(is_array($arrExtraParams)) {
      foreach($arrExtraParams as $k => $v) {
        $$k = $v;
      }
    }
    
    eval('$strPagina .= "' . $this->Get($strTemplateHead) . '";');
    return $strPagina;
  }
};

?>
